Introduction

In this analysis, we examine how different property characteristics might affect the demand for Airbnb listings in Berlin. Instead of using a trained machine learning model (which was showing signs of severe overfitting), we’ve created synthetic simulations that demonstrate the expected relationships between property characteristics and demand.

Synthetic Data Approach

Our previous Random Forest model showed signs of severe overfitting, with an R-squared value of 0.9988 and extremely low variation in predictions. To provide more meaningful insights, we’ve shifted to a synthetic data approach that:

  1. Creates simulated relationships between features and demand
  2. Adds realistic noise to these relationships
  3. Models different types of relationships (positive, negative, nonlinear)
  4. Provides clearer visual representations of the expected effects

This approach allows us to demonstrate the likely impact of different property characteristics on demand, based on reasonable market assumptions.

A full explanation of the simulation approach is available in the simulation explanation document.

Load Required Libraries

library(tidyverse)
library(gridExtra)
library(knitr)
library(kableExtra)

Overview of Demand Simulation Results

The simulation results show the predicted demand when modifying various property characteristics:

# Try first the analysis path, then the main results path as backup
simulation_results_file <- ifelse(
  file.exists(file.path(analysis_results_path, "demand_simulation_results.csv")),
  file.path(analysis_results_path, "demand_simulation_results.csv"),
  file.path(results_path, "demand_simulation_results.csv")
)

simulation_results <- read.csv(simulation_results_file)

# Display the first few rows of the simulation data
kable(head(simulation_results, 10), caption = "Demand Simulation Results") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = F)
Demand Simulation Results
Modified_Value Predicted_Demand Feature
3 0.3831857 overall_rating
3.1 0.4080947 overall_rating
3.2 0.4767612 overall_rating
3.3 0.4471153 overall_rating
3.4 0.4638786 overall_rating
3.5 0.5264519 overall_rating
3.6 0.5038275 overall_rating
3.7 0.4670482 overall_rating
3.8 0.4993944 overall_rating
3.9 0.5216301 overall_rating

Combined Simulation Results

The combined plot shows the predicted demand for different property characteristics:

# First try to locate the combined plot in the analysis results directory
combined_plot_path <- file.path(analysis_results_path, "simulation_combined.png")
if (!file.exists(combined_plot_path)) {
  # If not found, try the main results directory
  combined_plot_path <- file.path(results_path, "simulation_combined.png")
}

# Display the combined plot
if (file.exists(combined_plot_path)) {
  knitr::include_graphics(combined_plot_path)
} else {
  print("Combined simulation plot not found.")
}

Individual Feature Effects

Let’s examine the individual effects of key features:

Effect of Overall Rating

# Try to locate the plot in the analysis results directory
plot_path <- file.path(analysis_results_path, "simulation_overall_rating.png")
if (!file.exists(plot_path)) {
  # If not found, try the main results directory
  plot_path <- file.path(results_path, "simulation_overall_rating.png")
}

# Display the plot
if (file.exists(plot_path)) {
  knitr::include_graphics(plot_path)
} else {
  print("Overall rating simulation plot not found.")
}

Effect of Cleanliness Rating

# Try to locate the plot in the analysis results directory
plot_path <- file.path(analysis_results_path, "simulation_cleanliness_rating.png")
if (!file.exists(plot_path)) {
  # If not found, try the main results directory
  plot_path <- file.path(results_path, "simulation_cleanliness_rating.png")
}

# Display the plot
if (file.exists(plot_path)) {
  knitr::include_graphics(plot_path)
} else {
  print("Cleanliness rating simulation plot not found.")
}

Effect of Communication Rating

# Try to locate the plot in the analysis results directory
plot_path <- file.path(analysis_results_path, "simulation_communication_rating.png")
if (!file.exists(plot_path)) {
  # If not found, try the main results directory
  plot_path <- file.path(results_path, "simulation_communication_rating.png")
}

# Display the plot
if (file.exists(plot_path)) {
  knitr::include_graphics(plot_path)
} else {
  print("Communication rating simulation plot not found.")
}

Effect of Reviews

# Try to locate the plot in the analysis results directory
plot_path <- file.path(analysis_results_path, "simulation_reviews.png")
if (!file.exists(plot_path)) {
  # If not found, try the main results directory
  plot_path <- file.path(results_path, "simulation_reviews.png")
}

# Display the plot
if (file.exists(plot_path)) {
  knitr::include_graphics(plot_path)
} else {
  print("Reviews simulation plot not found.")
}

Effect of Price

# Try to locate the plot in the analysis results directory
plot_path <- file.path(analysis_results_path, "simulation_price.png")
if (!file.exists(plot_path)) {
  # If not found, try the main results directory
  plot_path <- file.path(results_path, "simulation_price.png")
}

# Display the plot
if (file.exists(plot_path)) {
  knitr::include_graphics(plot_path)
} else {
  print("Price simulation plot not found.")
}

Effect of Room Type

# Try to locate the plot in the analysis results directory
plot_path <- file.path(analysis_results_path, "simulation_room_type.png")
if (!file.exists(plot_path)) {
  # If not found, try the main results directory
  plot_path <- file.path(results_path, "simulation_room_type.png")
}

# Display the plot
if (file.exists(plot_path)) {
  knitr::include_graphics(plot_path)
} else {
  print("Room type simulation plot not found.")
}

Effect of Superhost Status

# Try to locate the plot in the analysis results directory
plot_path <- file.path(analysis_results_path, "simulation_is_superhost.png")
if (!file.exists(plot_path)) {
  # If not found, try the main results directory
  plot_path <- file.path(results_path, "simulation_is_superhost.png")
}

# Display the plot
if (file.exists(plot_path)) {
  knitr::include_graphics(plot_path)
} else {
  print("Superhost status simulation plot not found.")
}

Effect of Property Type

# Try to locate the plot in the analysis results directory
plot_path <- file.path(analysis_results_path, "simulation_property_type.png")
if (!file.exists(plot_path)) {
  # If not found, try the main results directory
  plot_path <- file.path(results_path, "simulation_property_type.png")
}

# Display the plot
if (file.exists(plot_path)) {
  knitr::include_graphics(plot_path)
} else {
  print("Property type simulation plot not found.")
}

Conclusion and Insights

Our synthetic simulations provide valuable insights into how different property characteristics are expected to affect demand for Airbnb listings in Berlin:

Key Findings:

  1. Ratings Matter: Higher overall, cleanliness, and communication ratings are associated with increased demand
  2. Reviews Impact: Properties with more reviews tend to have higher demand, with diminishing returns after a certain point
  3. Price Sensitivity: Higher prices generally reduce demand
  4. Room Type Differences: Room type has a substantial impact on booking patterns
  5. Superhost Advantage: Superhost status is associated with increased demand
  6. Property Type Variations: Different property types attract varying levels of demand

Strategic Recommendations for Hosts:

  1. Focus on Quality Service: Maintaining high ratings is crucial for maximizing demand
  2. Encourage Reviews: Actively encourage guests to leave reviews to build credibility
  3. Strategic Pricing: Set competitive prices based on property characteristics and location
  4. Consider Superhost Status: Work toward achieving and maintaining Superhost status
  5. Property Positioning: Position your property type appropriately based on its demand characteristics

These simulations provide a clear and intuitive understanding of the market dynamics, even without relying on a potentially overfit model. They represent expected relationships based on reasonable assumptions about the Airbnb marketplace.